ã¢ãã³ãªWebã¢ããªã±ãŒã·ã§ã³ã«ããããã«ãããŒãåæã®ããã®ããã³ããšã³ã忣ããã¯ç®¡çã®è€éããæ¢ããŸããå®è£ æŠç¥ã課é¡ããã¹ããã©ã¯ãã£ã¹ã«ã€ããŠåŠã³ãŸãããã
ããã³ããšã³ã忣ããã¯ãããŒãžã£ãŒïŒãã«ãããŒãåæã®å®çŸ
仿¥ã®ãŸããŸãè€éåããWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç°ãªãããã€ã¹äžã®è€æ°ã®ãã©ãŠã¶ã€ã³ã¹ã¿ã³ã¹ãã¿ãã«ããã£ãŠããŒã¿ã®äžè²«æ§ã確ä¿ããç«¶åç¶æ ãé²ãããšã極ããŠéèŠã§ããããã«ã¯å ç¢ãªåæã¡ã«ããºã ãå¿ èŠãšãªããŸããããã¯ãšã³ãã·ã¹ãã ã«ã¯åæ£ãããã³ã°ã®ããã®ç¢ºç«ããããã¿ãŒã³ããããŸãããããã³ããšã³ãã«ã¯ç¹æã®èª²é¡ããããŸãããã®èšäºã§ã¯ãããã³ããšã³ã忣ããã¯ãããŒãžã£ãŒã®äžçã«æ·±ãå ¥ã蟌ã¿ããã®å¿ èŠæ§ãå®è£ ã¢ãããŒãããããŠãã«ãããŒãåæãå®çŸããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
ããã³ããšã³ã忣ããã¯ã®å¿ èŠæ§ã®çè§£
åŸæ¥ã®Webã¢ããªã±ãŒã·ã§ã³ã¯ãå€ãã®å Žåãã·ã³ã°ã«ãŠãŒã¶ãŒãã·ã³ã°ã«ã¿ãã§ã®äœéšã§ãããããããçŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã¯é »ç¹ã«ä»¥äžããµããŒãããŠããŸãïŒ
- ãã«ãã¿ã/ãã«ããŠã£ã³ããŠã·ããªãªïŒãŠãŒã¶ãŒã¯ãã°ãã°è€æ°ã®ã¿ãããŠã£ã³ããŠãéãããããããåãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ãå®è¡ããŠããŸãã
- ã¯ãã¹ããã€ã¹åæïŒãŠãŒã¶ãŒã¯è€æ°ã®ããã€ã¹ïŒãã¹ã¯ããããã¢ãã€ã«ãã¿ãã¬ããïŒã§åæã«ã¢ããªã±ãŒã·ã§ã³ãæäœããŸãã
- å ±åç·šéïŒè€æ°ã®ãŠãŒã¶ãŒããªã¢ã«ã¿ã€ã ã§åãããã¥ã¡ã³ããããŒã¿ã§äœæ¥ããŸãã
ãããã®ã·ããªãªã¯ãå ±æããŒã¿ãžã®åæå€æŽã®å¯èœæ§ãããããã以äžã®åé¡ãåŒãèµ·ãããŸãïŒ
- ç«¶åç¶æ ïŒè€æ°ã®æäœãåããªãœãŒã¹ãããã£ãŠç«¶åãããšãçµæã¯äºæž¬äžå¯èœãªå®è¡é åºã«äŸåããããŒã¿ã®äžæŽåãåŒãèµ·ãããŸãã
- ããŒã¿ç ŽæïŒåãããŒã¿ãžã®åææžã蟌ã¿ã¯ããã®æŽåæ§ãæãªãå¯èœæ§ããããŸãã
- äžæŽåãªç¶æ ïŒç°ãªãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ãççŸããæ å ±ã衚瀺ããå¯èœæ§ããããŸãã
ããã³ããšã³ã忣ããã¯ãããŒãžã£ãŒã¯ãå ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãã·ãªã¢ã©ã€ãºããã¡ã«ããºã ãæäŸãããããã®åé¡ã鲿¢ãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹éã§ããŒã¿ã®äžè²«æ§ãä¿èšŒããŸããããã¯åæããªããã£ããšããŠæ©èœããç¹å®ã®æéã«ãããŠç¹å®ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãã«å¶éããŸããã°ããŒãã«ãªeã³ããŒã¹ã®ã«ãŒããèããŠã¿ãŠãã ãããé©åãªããã¯ããªããã°ãããã¿ãã§ååã远å ãããŠãŒã¶ãŒãå¥ã®ã¿ãã§ãããããã«ç¢ºèªã§ãããæ··ä¹±ãæãã·ã§ããã³ã°äœéšã«ã€ãªããå¯èœæ§ããããŸãã
ããã³ããšã³ã忣ããã¯ç®¡çã®èª²é¡
ããã³ããšã³ãã«åæ£ããã¯ãããŒãžã£ãŒãå®è£ ããããšã¯ãããã¯ãšã³ããœãªã¥ãŒã·ã§ã³ãšæ¯èŒããŠããã€ãã®èª²é¡ããããŸãïŒ
- ãã©ãŠã¶ã®äžæçãªæ§è³ªïŒãã©ãŠã¶ã€ã³ã¹ã¿ã³ã¹ã¯æ¬è³ªçã«ä¿¡é Œæ§ããããŸãããã¿ãã¯äºæããéããããããšãããããããã¯ãŒã¯æ¥ç¶ã¯æç¶çã«ãªãå¯èœæ§ããããŸãã
- å ç¢ãªã¢ãããã¯æäœã®æ¬ åŠïŒã¢ãããã¯æäœãæã€ããŒã¿ããŒã¹ãšã¯ç°ãªããããã³ããšã³ãã¯JavaScriptã«äŸåããŠãããçã®ã¢ãããã¯æäœã®ãµããŒãã¯éãããŠããŸãã
- éãããã¹ãã¬ãŒãžãªãã·ã§ã³ïŒããã³ããšã³ãã®ã¹ãã¬ãŒãžãªãã·ã§ã³ïŒlocalStorageãsessionStorageãCookieïŒã¯ããµã€ãºãæ°žç¶æ§ãç°ãªããã¡ã€ã³éã§ã®ã¢ã¯ã»ã·ããªãã£ã«é¢ããŠå¶éããããŸãã
- ã»ãã¥ãªãã£äžã®æžå¿µïŒæ©å¯ããŒã¿ã¯ããã³ããšã³ãã¹ãã¬ãŒãžã«çŽæ¥ä¿åãã¹ãã§ã¯ãªããããã¯ã¡ã«ããºã èªäœãæäœããä¿è·ãããã¹ãã§ãã
- ããã©ãŒãã³ã¹ã®ãªãŒããŒãããïŒäžå€®ã®ããã¯ãµãŒããŒãšã®é »ç¹ãªéä¿¡ã¯ãé å»¶ãåŒãèµ·ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
ããã³ããšã³ã忣ããã¯ã®å®è£ æŠç¥
ããã³ããšã³ã忣ããã¯ãå®è£ ããããã«ã¯ãããã€ãã®æŠç¥ãæ¡çšã§ããŸããããããã«ç¬èªã®ãã¬ãŒããªãããããŸãïŒ
1. TTLïŒTime-To-LiveïŒä»ãã®localStorageã䜿çšãã
ãã®ã¢ãããŒãã¯ãlocalStorage APIãæŽ»çšããŠããã¯ããŒãä¿åããŸããã¯ã©ã€ã¢ã³ããããã¯ãååŸãããå Žåãç¹å®ã®TTLã§ããã¯ããŒãèšå®ããããšããŸããããŒããã§ã«ååšããå Žåãããã¯å¥ã®ã¯ã©ã€ã¢ã³ããããã¯ãä¿æããŠããããšãæå³ããŸãã
äŸ (JavaScript):
async function acquireLock(lockKey, ttl = 5000) {
const lockAcquired = localStorage.getItem(lockKey);
if (lockAcquired && parseInt(lockAcquired) > Date.now()) {
return false; // Lock is already held
}
localStorage.setItem(lockKey, Date.now() + ttl);
return true; // Lock acquired
}
function releaseLock(lockKey) {
localStorage.removeItem(lockKey);
}
é·æïŒ
- å®è£ ãç°¡åã
- å€éšäŸåé¢ä¿ããªãã
çæïŒ
- çã«åæ£ãããŠããããåããã¡ã€ã³ãšãã©ãŠã¶ã«éå®ãããã
- ã¯ã©ã€ã¢ã³ããããã¯ãè§£æŸããåã«ã¯ã©ãã·ã¥ããå Žåã®ãããããã¯ãé²ãããã«ãTTLã®æ éãªåŠçãå¿ èŠã
- ããã¯ã®å ¬å¹³æ§ãåªå é äœã®ããã®çµã¿èŸŒã¿ã¡ã«ããºã ããªãã
- ç°ãªãã¯ã©ã€ã¢ã³ãã®ã·ã¹ãã æå»ãå€§å¹ ã«ç°ãªãå Žåãã¯ããã¯ã¹ãã¥ãŒåé¡ã®åœ±é¿ãåããããã
2. BroadcastChannel APIãšsessionStorageã䜿çšãã
SessionStorageã¯localStorageã«äŒŒãŠããŸããããã®ããŒã¿ã¯ãã©ãŠã¶ã»ãã·ã§ã³ã®æéäžã®ã¿æç¶ããŸããBroadcastChannel APIã¯ãåããªãªãžã³ãå ±æãããã©ãŠãžã³ã°ã³ã³ããã¹ãïŒäŸïŒã¿ãããŠã£ã³ããŠïŒéã®éä¿¡ãå¯èœã«ããŸãã
äŸ (JavaScript):
const channel = new BroadcastChannel('my-lock-channel');
async function acquireLock(lockKey) {
return new Promise((resolve) => {
const checkLock = () => {
if (!sessionStorage.getItem(lockKey)) {
sessionStorage.setItem(lockKey, 'locked');
channel.postMessage({ type: 'lock-acquired', key: lockKey });
resolve(true);
} else {
setTimeout(checkLock, 50);
}
};
checkLock();
});
}
async function releaseLock(lockKey) {
sessionStorage.removeItem(lockKey);
channel.postMessage({ type: 'lock-released', key: lockKey });
}
channel.addEventListener('message', (event) => {
const { type, key } = event.data;
if (type === 'lock-released' && key === lockKey) {
// Another tab released the lock
// Potentially trigger a new lock acquisition attempt
}
});
é·æïŒ
- åããªãªãžã³ã®ã¿ã/ãŠã£ã³ããŠéã®éä¿¡ãå¯èœã«ããã
- ã»ãã·ã§ã³åºæã®ããã¯ã«é©ããŠããã
çæïŒ
- ãŸã çã«åæ£ãããŠããããåäžã®ãã©ãŠã¶ã»ãã·ã§ã³ã«éå®ãããã
- BroadcastChannel APIã«äŸåããŠããããã¹ãŠã®ãã©ãŠã¶ã§ãµããŒããããŠããããã§ã¯ãªãã
- ãã©ãŠã¶ã®ã¿ãããŠã£ã³ããŠãéãããããšSessionStorageã¯ã¯ãªã¢ãããã
3. äžå€®éæš©åããã¯ãµãŒããŒïŒäŸïŒRedisãNode.jsãµãŒããŒïŒ
ãã®ã¢ãããŒãã¯ãRedisãã«ã¹ã¿ã ã®Node.jsãµãŒããŒãªã©ã®å°çšããã¯ãµãŒããŒã䜿çšããŠããã¯ã管çããŸããããã³ããšã³ãã¯ã©ã€ã¢ã³ãã¯ãHTTPãŸãã¯WebSocketãä»ããŠããã¯ãµãŒããŒãšéä¿¡ããããã¯ã®ååŸãšè§£æŸãè¡ããŸãã
æŠå¿µçãªäŸïŒ
- ããã³ããšã³ãã¯ã©ã€ã¢ã³ãããç¹å®ã®ãªãœãŒã¹ã®ããã¯ãååŸããããã«ããã¯ãµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ããŸãã
- ããã¯ãµãŒããŒã¯ãããã¯ãå©çšå¯èœãã©ããã確èªããŸãã
- ããã¯ãå©çšå¯èœãªå ŽåããµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã«ããã¯ãä»äžããã¯ã©ã€ã¢ã³ãã®èå¥åãä¿åããŸãã
- ããã¯ããã§ã«ä¿æãããŠããå ŽåããµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ãããã¥ãŒã«å ¥ãããããšã©ãŒãè¿ãããšãã§ããŸãã
- ããã³ããšã³ãã¯ã©ã€ã¢ã³ãã¯ãããã¯ãå¿ èŠãšããæäœãå®è¡ããŸãã
- ããã³ããšã³ãã¯ã©ã€ã¢ã³ãã¯ãããã¯ãµãŒããŒã«éç¥ããŠããã¯ãè§£æŸããŸãã
- ããã¯ãµãŒããŒã¯ããã¯ãè§£æŸããå¥ã®ã¯ã©ã€ã¢ã³ãããããååŸã§ããããã«ããŸãã
é·æïŒ
- è€æ°ã®ããã€ã¹ããã©ãŠã¶ã«ãŸãããçã®åæ£ããã¯ã¡ã«ããºã ãæäŸããŸãã
- å ¬å¹³æ§ãåªå é äœãã¿ã€ã ã¢ãŠããªã©ãããã¯ç®¡çã«å¯Ÿããããå€ãã®å¶åŸ¡ãæäŸããŸãã
çæïŒ
- å¥ã®ããã¯ãµãŒããŒã®ã»ããã¢ãããšä¿å®ãå¿ èŠã§ãã
- ãããã¯ãŒã¯é å»¶ãçºçããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- localStorageãsessionStorageããŒã¹ã®ã¢ãããŒããšæ¯èŒããŠè€éããå¢ããŸãã
- ããã¯ãµãŒããŒã®å¯çšæ§ã«äŸåããããã«ãªããŸãã
Redisãããã¯ãµãŒããŒãšããŠäœ¿çšãã
Redisã¯ã髿§èœãªããã¯ãµãŒããŒãšããŠäœ¿çšã§ãã人æ°ã®ã€ã³ã¡ã¢ãªããŒã¿ã¹ãã¢ã§ãã忣ããã¯ã®å®è£ ã«çæ³çãª`SETNX`ïŒSET if Not eXistsïŒã®ãããªã¢ãããã¯æäœãæäŸããŸãã
äŸ (Node.jsãšRedis):
const redis = require('redis');
const client = redis.createClient();
const { promisify } = require('util');
const setAsync = promisify(client.set).bind(client);
const getAsync = promisify(client.get).bind(client);
const delAsync = promisify(client.del).bind(client);
async function acquireLock(lockKey, clientId, ttl = 5000) {
const lock = await setAsync(lockKey, clientId, 'NX', 'PX', ttl);
return lock === 'OK';
}
async function releaseLock(lockKey, clientId) {
const currentClientId = await getAsync(lockKey);
if (currentClientId === clientId) {
await delAsync(lockKey);
return true;
}
return false; // Lock was held by someone else
}
// Example usage
const clientId = 'unique-client-id';
acquireLock('my-resource-lock', clientId, 10000) // Acquire lock for 10 seconds
.then(acquired => {
if (acquired) {
console.log('Lock acquired!');
// Perform operations requiring the lock
setTimeout(() => {
releaseLock('my-resource-lock', clientId)
.then(released => {
if (released) {
console.log('Lock released!');
} else {
console.log('Failed to release lock (held by someone else)');
}
});
}, 5000); // Release lock after 5 seconds
} else {
console.log('Failed to acquire lock');
}
});
ãã®äŸã§ã¯ã`SETNX`ã䜿çšããŠãããã¯ããŒãååšããªãå Žåã«ã¢ãããã¯ã«èšå®ããŸããã¯ã©ã€ã¢ã³ããã¯ã©ãã·ã¥ããå Žåã®ãããããã¯ãé²ãããã«ãTTLãèšå®ãããŠããŸãã`releaseLock`颿°ã¯ãããã¯ãè§£æŸããã¯ã©ã€ã¢ã³ãããããååŸããã¯ã©ã€ã¢ã³ããšåãã§ããããšã確èªããŸãã
ã«ã¹ã¿ã Node.jsããã¯ãµãŒããŒã®å®è£
ãããã¯ãNode.jsãšããŒã¿ããŒã¹ïŒäŸïŒMongoDBãPostgreSQLïŒãŸãã¯ã€ã³ã¡ã¢ãªããŒã¿æ§é ã䜿çšããŠã«ã¹ã¿ã ããã¯ãµãŒããŒãæ§ç¯ããããšãã§ããŸããããã«ãããããé«ãæè»æ§ãšã«ã¹ã¿ãã€ãºãå¯èœã«ãªããŸãããããå€ãã®éçºå·¥æ°ãå¿ èŠã«ãªããŸãã
æŠå¿µçãªå®è£ ïŒ
- ããã¯ãååŸããããã®APIãšã³ããã€ã³ããäœæããŸãïŒäŸïŒ`/locks/:resource/acquire`ïŒã
- ããã¯ãè§£æŸããããã®APIãšã³ããã€ã³ããäœæããŸãïŒäŸïŒ`/locks/:resource/release`ïŒã
- ããã¯æ å ±ïŒãªãœãŒã¹åãã¯ã©ã€ã¢ã³ãIDãã¿ã€ã ã¹ã¿ã³ãïŒãããŒã¿ããŒã¹ãŸãã¯ã€ã³ã¡ã¢ãªããŒã¿æ§é ã«ä¿åããŸãã
- é©åãªããŒã¿ããŒã¹ãããã³ã°ã¡ã«ããºã ïŒäŸïŒãªããã£ãã¹ãã£ãã¯ãããã³ã°ïŒãŸãã¯åæããªããã£ãïŒäŸïŒãã¥ãŒããã¯ã¹ïŒã䜿çšããŠãã¹ã¬ããã»ãŒããã£ã確ä¿ããŸãã
4. Web WorkersãšSharedArrayBufferã®äœ¿çšïŒé«åºŠãªææ³ïŒ
Web Workersã¯ãã¡ã€ã³ã¹ã¬ãããšã¯ç¬ç«ããŠããã¯ã°ã©ãŠã³ãã§JavaScriptã³ãŒããå®è¡ããæ¹æ³ãæäŸããŸããSharedArrayBufferã¯ãWeb Workersãšã¡ã€ã³ã¹ã¬ããéã§ã¡ã¢ãªãå ±æããããšãå¯èœã«ããŸãã
ãã®ã¢ãããŒãã¯ããã髿§èœã§å ç¢ãªããã¯ã¡ã«ããºã ãå®è£ ããããã«äœ¿çšã§ããŸãããããè€éã§ãããäžŠè¡æ§ãšåæã®åé¡ãæ éã«èæ ®ããå¿ èŠããããŸãã
é·æïŒ
- å ±æã¡ã¢ãªã«ãããããé«ãããã©ãŒãã³ã¹ã®å¯èœæ§ããããŸãã
- ããã¯ç®¡çãå¥ã®ã¹ã¬ããã«ãªãããŒãããŸãã
çæïŒ
- å®è£ ãšãããã°ãè€éã§ãã
- ã¹ã¬ããéã®æ éãªåæãå¿ èŠã§ãã
- SharedArrayBufferã«ã¯ã»ãã¥ãªãã£äžã®æå³åãããããæå¹ã«ããã«ã¯ç¹å®ã®HTTPããããŒãå¿ èŠãªå ŽåããããŸãã
- ãã©ãŠã¶ã®ãµããŒããéãããŠããããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«é©ããŠããããã§ã¯ãªãå¯èœæ§ããããŸãã
ããã³ããšã³ã忣ããã¯ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
- é©åãªæŠç¥ãéžæããïŒè€éããããã©ãŒãã³ã¹ãä¿¡é Œæ§ã®éã®ãã¬ãŒããªããèæ ®ããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«åºã¥ããŠå®è£ ã¢ãããŒããéžæããŸããåçŽãªã·ããªãªã§ã¯ãlocalStorageãŸãã¯sessionStorageã§ååãããããŸãããããèŠæ±ã®å³ããã·ããªãªã§ã¯ãäžå€®éæš©åããã¯ãµãŒããŒãæšå¥šãããŸãã
- TTLãå®è£ ããïŒã¯ã©ã€ã¢ã³ãã®ã¯ã©ãã·ã¥ããããã¯ãŒã¯ã®åé¡ãçºçããå Žåã®ãããããã¯ãé²ãããã«ãåžžã«TTLã䜿çšããŸãã
- äžæã®ããã¯ããŒã䜿çšããïŒç°ãªããªãœãŒã¹éã®ç«¶åãé¿ããããã«ãããã¯ããŒãäžæã§èª¬æçã§ããããšã確èªããŸããåå空éèŠåã®äœ¿çšãæ€èšããŠãã ãããäŸãã°ãç¹å®ã®ãŠãŒã¶ãŒã®ã«ãŒãã«é¢é£ããããã¯ã«ã¯ `cart:user123:lock` ã®ããã«ããŸãã
- ææ°ããã¯ãªãä»ãã®ãªãã©ã€ãå®è£ ããïŒã¯ã©ã€ã¢ã³ããããã¯ã®ååŸã«å€±æããå Žåãããã¯ãµãŒããŒãå§åããªãããã«ãææ°ããã¯ãªãä»ãã®ãªãã©ã€ã¡ã«ããºã ãå®è£ ããŸãã
- ããã¯ã®ç«¶åãé©åã«åŠçããïŒããã¯ãååŸã§ããªãå Žåã¯ããŠãŒã¶ãŒã«æçãªãã£ãŒãããã¯ãæäŸããŸããç¡æéã®ããããã³ã°ã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªããããé¿ããŠãã ããã
- ããã¯ã®äœ¿çšç¶æ³ãç£èŠããïŒããã¯ã®ååŸãšè§£æŸã®æéã远跡ããæœåšçãªããã©ãŒãã³ã¹ã®ããã«ããã¯ãç«¶åã®åé¡ãç¹å®ããŸãã
- ããã¯ãµãŒããŒãä¿è·ããïŒããã¯ãµãŒããŒãäžæ£ãªã¢ã¯ã»ã¹ãæäœããä¿è·ããŸããèªèšŒããã³èªå¯ã¡ã«ããºã ã䜿çšããŠãæ¿èªãããã¯ã©ã€ã¢ã³ããžã®ã¢ã¯ã»ã¹ãå¶éããŸããããã³ããšã³ããšããã¯ãµãŒããŒéã®éä¿¡ãæå·åããããã«HTTPSã®äœ¿çšãæ€èšããŠãã ããã
- ããã¯ã®å ¬å¹³æ§ãèæ ®ããïŒãã¹ãŠã®ã¯ã©ã€ã¢ã³ããããã¯ãååŸããå ¬å¹³ãªæ©äŒãæã€ããšãä¿èšŒããã¡ã«ããºã ãå®è£ ããç¹å®ã®ã¯ã©ã€ã¢ã³ãã®é£¢é€ç¶æ ãé²ããŸããFIFOïŒå å ¥ãå åºãïŒãã¥ãŒã䜿çšããŠãããã¯èŠæ±ãå ¬å¹³ã«ç®¡çã§ããŸãã
- ã¹ãçæ§ïŒããã¯ã«ãã£ãŠä¿è·ãããæäœãã¹ãçã§ããããšã確èªããŸããããã¯ãæäœãè€æ°åå®è¡ãããŠããäžåºŠã ãå®è¡ããå Žåãšåã广ãæã€ããšãæå³ããŸããããã¯ããããã¯ãŒã¯ã®åé¡ãã¯ã©ã€ã¢ã³ãã®ã¯ã©ãã·ã¥ã«ããããã¯ãææå°æ©ã«è§£æŸãããå¯èœæ§ãããã±ãŒã¹ãåŠçããããã«éèŠã§ãã
- ããŒãããŒãã䜿çšããïŒäžå€®éæš©åããã¯ãµãŒããŒã䜿çšããå ŽåããµãŒããŒãäºæããåæãããã¯ã©ã€ã¢ã³ãã«ãã£ãŠä¿æãããŠããããã¯ãæ€åºããŠè§£æŸã§ããããã«ãããŒãããŒãã¡ã«ããºã ãå®è£ ããŸããããã«ãããããã¯ãç¡æéã«ä¿æãããã®ãé²ããŸãã
- 培åºçã«ãã¹ãããïŒåæã¢ã¯ã»ã¹ããããã¯ãŒã¯é害ãã¯ã©ã€ã¢ã³ãã®ã¯ã©ãã·ã¥ãªã©ãããŸããŸãªæ¡ä»¶äžã§ããã¯ã¡ã«ããºã ãå³å¯ã«ãã¹ãããŸããèªåãã¹ãããŒã«ã䜿çšããŠãçŸå®çãªã·ããªãªãã·ãã¥ã¬ãŒãããŸãã
- å®è£ ãææžåããïŒå®è£ ã®è©³çްãäœ¿çšæ¹æ³ãæœåšçãªå¶éäºé ãªã©ãããã¯ã¡ã«ããºã ãæç¢ºã«ææžåããŸããããã«ãããä»ã®éçºè ãã³ãŒããçè§£ããç¶æããã®ã«åœ¹ç«ã¡ãŸãã
å ·äœäŸïŒãã©ãŒã ã®äºééä¿¡é²æ¢
ããã³ããšã³ã忣ããã¯ã®äžè¬çãªãŠãŒã¹ã±ãŒã¹ã¯ããã©ãŒã ã®äºééä¿¡ãé²ãããšã§ãããããã¯ãŒã¯æ¥ç¶ãé ãããã«ãŠãŒã¶ãŒãéä¿¡ãã¿ã³ãè€æ°åã¯ãªãã¯ããã·ããªãªãæ³åããŠã¿ãŠãã ãããããã¯ããªããã°ããã©ãŒã ããŒã¿ãè€æ°åéä¿¡ãããæå³ããªãçµæã«ã€ãªããå¯èœæ§ããããŸãã
localStorageã䜿çšããå®è£ ïŒ
const submitButton = document.getElementById('submit-button');
const form = document.getElementById('my-form');
const lockKey = 'form-submission-lock';
submitButton.addEventListener('click', async (event) => {
event.preventDefault();
if (await acquireLock(lockKey)) {
console.log('Submitting form...');
// Simulate form submission
setTimeout(() => {
console.log('Form submitted successfully!');
releaseLock(lockKey);
}, 2000);
} else {
console.log('Form submission already in progress. Please wait.');
}
});
ãã®äŸã§ã¯ã`acquireLock`颿°ããã©ãŒã ãéä¿¡ããåã«ããã¯ãååŸããããšã§ãè€æ°ã®ãã©ãŒã éä¿¡ãé²ããŸããããã¯ããã§ã«ä¿æãããŠããå ŽåããŠãŒã¶ãŒã¯åŸ æ©ããããã«éç¥ãããŸãã
å®äžçã®äŸ
- å ±åããã¥ã¡ã³ãç·šéïŒGoogle DocsãMicrosoft Office OnlineïŒïŒãããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãè€æ°ã®ãŠãŒã¶ãŒãããŒã¿ç Žæãªãã«åãããã¥ã¡ã³ããåæã«ç·šéã§ããããã«ãæŽç·Žããããããã³ã°ã¡ã«ããºã ã䜿çšããŠããŸããéåžžãåæç·šéãåŠçããããã«ãããã¯ãšçµã¿åãããŠéçšå€æïŒOTïŒãŸãã¯ç«¶åããªãŒãªè€è£œããŒã¿åïŒCRDTïŒãæ¡çšããŠããŸãã
- Eã³ããŒã¹ãã©ãããã©ãŒã ïŒAmazonãAlibabaïŒïŒãããã®ãã©ãããã©ãŒã ã¯ãåšåº«ã管çããéå°è²©å£²ãé²ããè€æ°ã®ããã€ã¹éã§äžè²«ããã«ãŒãããŒã¿ãä¿èšŒããããã«ããã¯ã䜿çšããŸãã
- ãªã³ã©ã€ã³ãã³ãã³ã°ã¢ããªã±ãŒã·ã§ã³ïŒãããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãæ©å¯æ§ã®é«ãéèããŒã¿ãä¿è·ããäžæ£ãªååŒãé²ãããã«ããã¯ã䜿çšããŸãã
- ãªã¢ã«ã¿ã€ã ã²ãŒã ïŒãã«ããã¬ã€ã€ãŒã²ãŒã ã¯ãã²ãŒã ã®ç¶æ ãåæãããããŒããé²ãããã«ãã°ãã°ããã¯ã䜿çšããŸãã
çµè«
ããã³ããšã³ã忣ããã¯ç®¡çã¯ãå ç¢ã§ä¿¡é Œæ§ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§éèŠãªåŽé¢ã§ãããã®èšäºã§èª¬æãã課é¡ãšå®è£ æŠç¥ãçè§£ããããšã§ãéçºè ã¯ç¹å®ã®ããŒãºã«é©ããã¢ãããŒããéžæããè€æ°ã®ãã©ãŠã¶ã€ã³ã¹ã¿ã³ã¹ãã¿ãã«ããã£ãŠããŒã¿ã®äžè²«æ§ã確ä¿ããç«¶åç¶æ ãé²ãããšãã§ããŸããlocalStorageãsessionStorageã䜿çšããåçŽãªãœãªã¥ãŒã·ã§ã³ã¯åºæ¬çãªã·ããªãªã«ã¯ååãããããŸããããçã®ãã«ãããŒãåæãå¿ èŠãšããè€éãªã¢ããªã±ãŒã·ã§ã³ã«ã¯ãäžå€®éæš©åããã¯ãµãŒããŒãæãå ç¢ã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããããã³ããšã³ã忣ããã¯ã¡ã«ããºã ãèšèšããã³å®è£ ããéã¯ãåžžã«ã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãããã³ãã©ãŒã«ããã¬ã©ã³ã¹ãåªå ããããšãå¿ããªãã§ãã ãããç°ãªãã¢ãããŒãã®ãã¬ãŒããªããæ éã«æ€èšããã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ã«æãé©ãããã®ãéžæããŠãã ãããæ¬çªç°å¢ã§ã®ããã¯ã¡ã«ããºã ã®ä¿¡é Œæ§ãšæå¹æ§ã確ä¿ããããã«ã¯ã培åºçãªãã¹ããšç£èŠãäžå¯æ¬ ã§ãã